package ar.edu.caece.pl.alex.model;

/**
 * Cada Token tiene: Tipo (ID, OPER, etc), Texto ("VAR1") y Clase 
 * (Se puede o no retornar / Se puede o no continuar parseando)
 */
public interface IToken {
	
	final int TYPE_IDENTIFICADOR	=  0; // a-z/A-Z 0-9
	final int TYPE_PALABRA_RESERVADA=  1; // if,then,else...etc
	final int TYPE_NUM_ENTERO		=  2; // 1234
	final int TYPE_NUM_NATURAL		=  3; // 1234n
	final int TYPE_CADENA			=  4; // 'asdf'
	final int TYPE_COMENTARIO		=  5; // {asdf}
	final int TYPE_DOS_PUNTOS		=  6; // :
	final int TYPE_ASIGNACION		=  7; // :=
	final int TYPE_OPER_IGUAL		=  8; // =
	final int TYPE_OPER_MAS_INT		=  9; // +
	final int TYPE_OPER_MAS_NAT		= 10; // ++
	final int TYPE_OPER_MENOS_INT	= 11; // -
	final int TYPE_OPER_MENOS_NAT	= 12; // --
	final int TYPE_OPER_MULT_INT	= 13; // *
	final int TYPE_OPER_MULT_NAT	= 14; // **
	final int TYPE_OPER_DIV_INT		= 15; // /
	final int TYPE_OPER_DIV_NAT		= 16; // //
	final int TYPE_OPER_MENOR		= 17; // <
	final int TYPE_OPER_MAYOR		= 18; // >
	final int TYPE_OPER_MENOR_IGUAL	= 19; // <=
	final int TYPE_OPER_MAYOR_IGUAL	= 20; // >=
	final int TYPE_OPER_DISTINTO	= 21; // >=
	final int TYPE_PARENTESIS_IZQ	= 22; // (
	final int TYPE_PARENTESIS_DER	= 23; // )
	final int TYPE_CORCHETE_IZQ		= 24; // [
	final int TYPE_CORCHETE_DER		= 25; // ]
	final int TYPE_COMA				= 26; // ,
	final int TYPE_PUNTO_COMA		= 27; // ;
	final int TYPE_SEPARADOR		= 28; // ' '\n\t\r\f\b
	final int TYPE_ERROR			= 29; // caracteres chinos?
	final int TYPE_FIN_DE_ARCHIVO	= 30; // EOF
	
	final String PALABRA_RESERVADA_IF		= "if";
	final String PALABRA_RESERVADA_THEN		= "then";
	final String PALABRA_RESERVADA_ELSE		= "else";
	final String PALABRA_RESERVADA_END_IF	= "end-if";
	final String PALABRA_RESERVADA_WHILE	= "while";
	final String PALABRA_RESERVADA_DO		= "do";
	final String PALABRA_RESERVADA_END_WHILE= "end-while";
	final String PALABRA_RESERVADA_SHOW		= "show";
	final String PALABRA_RESERVADA_SHOWLN	= "showln";
	final String PALABRA_RESERVADA_READ		= "read";
	final String PALABRA_RESERVADA_INTEGER	= "integer";
	final String PALABRA_RESERVADA_NATURAL	= "natural";
	final String PALABRA_RESERVADA_TOINTEGER= "tointeger";
	final String PALABRA_RESERVADA_TONATURAL= "tonatural";
	final String PALABRA_RESERVADA_BYVAL	= "byval";
	final String PALABRA_RESERVADA_BYREF	= "byref";
	final String PALABRA_RESERVADA_PROCEDURE= "procedure";
	final String PALABRA_RESERVADA_BEGIN	= "begin";
	final String PALABRA_RESERVADA_FUNCTION	= "function";
	final String PALABRA_RESERVADA_END_PROC	= "end-proc";
	final String PALABRA_RESERVADA_END_FUNC	= "end-func";
	final String PALABRA_RESERVADA_ODD		= "odd";
	final String PALABRA_RESERVADA_EVEN		= "even";
	final String PALABRA_RESERVADA_VAR		= "var";
	final String PALABRA_RESERVADA_CONST	= "const";
	
	/**
	 * Devuelve el nombre del tipo de token
	 * Ej: Token de Error, Token Operador, Token Fin de Archivo, Token palabra reservada, etc. 
	 */
	public int getType();
	
	/**
	 * Para cambiar el tipo de Token a medida que se parsea 
	 */
	public void setType(int type);
	
	
	/**
	 * Devuelve el texto del token
	 */
	public String getTokenText();
	
	/**
	 * Agrega el caracter leido al token
	 * @param s, caracter leido
	 * @throws IllegalStateException si solo si:
	 *    · se intenta agregar texto a un token que no puede continuar
	 *    · el token no esta completamente armado
	 */
	public IToken append(String s) throws IllegalStateException;
	
	/** Si hay que devolverlo o no al Analizador Sintactico */
	public boolean isRetornable();
	
	/** Devuelve las coordenadas (fila,columna) del Token */
	public int[] getCoords();
	
	public void setCoords(int[] coords);
	
}
